package com.minimalist.basic.service;

import com.minimalist.common.config.mybatis.bo.PageResp;
import com.minimalist.common.entity.basic.vo.file.*;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotNull;

import java.util.List;

/**
 * @author 11987
 */
public interface FileService{

    /**
     * 单文件上传
     *
     * @param fileUploadVO 文件及携带参数
     * @return 文件信息
     */
    FileUploadRespVO uploadFile(FileUploadVO fileUploadVO);

    /**
     * 多上传文件
     *
     * @param uploadBatchVO 文件及携带参数
     * @return 文件信息
     */
    List<FileUploadRespVO> uploadFileBatch(FileUploadBatchVO uploadBatchVO);

    /**
     * 删除文件
     *
     * @param fileId 文件ID
     */
    void deleteFile(Long fileId);

    /**
     * 查询文件列表(分页)
     *
     * @param queryVO 查询条件
     * @return 文件分页数据
     */
    PageResp<FileVO> getPageFileList(FileQueryVO queryVO);

    /**
     * 文件下载
     *
     * @param fileId   文件ID
     * @param response 响应
     */
    void downloadFile(Long fileId, HttpServletResponse response);

    /**
     * 根据文件ID查询文件信息
     *
     * @param fileId 文件ID
     * @return 文件信息
     */
    FileVO getFileByFileId(Long fileId);

    /**
     * 根据文件ID列表查询文件信息
     *
     * @param fileIds 文件ID列表
     * @return 文件信息列表
     */
    List<FileVO> getFileListByFileIds(@NotNull(message = "文件ID列表不能为空") List<Long> fileIds);

    /**
     * 根据文件URL更新文件状态
     *
     * @param fileUpdateStatusVO 文件状态更新参数
     */
    void updateStatusByFileUrl(FileUpdateStatusVO fileUpdateStatusVO);

    /**
     * 批量删除文件
     *
     * @param fileIds 文件ID列表
     */
    void deleteBatchFiles(List<Long> fileIds);

    /**
     * 根据文件ID查询文件信息(不包含租户ID)
     *
     * @param fileIds 文件ID
     * @return 文件信息
     */
    List<FileVO> getFileListByFileIdsWithoutTenant(List<Long> fileIds);

    /**
     * 删除文件(不包含租户ID)
     *
     * @param fileId 文件ID
     */
    void deleteFileWithoutTenant(Long fileId);

    /**
     * 批量删除文件(不包含租户ID)
     *
     * @param fileIds 文件ID列表
     */
    void deleteBatchFilesWithoutTenant(List<Long> fileIds);

    /**
     * 上传文件(不包含租户ID)
     *
     * @param fileUploadVO 文件及携带参数
     * @return 文件信息
     */
    FileUploadRespVO uploadFileWithoutTenant(FileUploadVO fileUploadVO);
}
